﻿using System;
using Castle.MonoRail.Framework;
using System.Collections.Generic;
using NHibernate.Mapping;
using CoopSaude.Dto;
using CoopSaude.DAO;

namespace CoopSaude.Controllers
{
    [ControllerDetails(Area = "Prontuario")]
    [DefaultAction("Buscar")]
    public class ProcedimentoController : BaseController
    {
        #region Actions
        public void Buscar()
        {
            try
            {
                string nomePaciente = Params["nome_paciente"];
                List<PacienteDto> lsPacientes;

                string paciente = Params["paciente"];
                if (paciente != null && !String.IsNullOrEmpty(paciente))
                {
                    lsPacientes = PacienteDto.BuscarPorNome(paciente);
                    PropertyBag["pacientes"] = lsPacientes;
                    Session["listaPacientes"] = lsPacientes;
                }
                else
                {
                    lsPacientes = PacienteDto.BuscarPorNome("");
                    PropertyBag["pacientes"] = lsPacientes;
                    Session["listaPacientes"] = lsPacientes;

                }

                List<MedicoDTO> medicos = MedicoDTO.ListarMedicos();
                PropertyBag["medicos"] = medicos;
                Session["listaMedicos"] = medicos;

            }
            catch (Exception e)
            {
                Flash["erro"] = "Ocorreu um erro ao acessar o serviço";
            }
            this.MenuUtilizado = "prontuario";
            this.SecaoUtilizada = "procedimento";
            this.AcaoUtilizada = "buscar";
        }

        public void Listar()
        {

            string idPaciente = Params["paciente_sel"];
            string idMedico = Params["medico_sel"];

            List<ProcedimentoDTO> procedimentos;
            List<PacienteDto> listaPaciente = (List<PacienteDto>)Session["listaPacientes"];
            List<MedicoDTO> listaMedico = (List<MedicoDTO>)Session["listaMedicos"];
            try
            {
                procedimentos = ProcedimentoDTO.ListarProcedimentos(idMedico, idPaciente);
                PropertyBag["procedimentos"] = procedimentos;
                PropertyBag["paciente"] = listaPaciente.Find(x => x.Id == int.Parse(idPaciente));
                PropertyBag["medico"] = listaMedico.Find(x => x.Id == int.Parse(idMedico));
                Session["procedimentos"] = procedimentos;
            }
            catch (Exception)
            {
                Flash["error"] = "Ocorreu um erro ao acessar o serviço";
            }

        }

        public void Exibir()
        {
            List<ProcedimentoDTO> procedimentos = (List<ProcedimentoDTO>)Session["procedimentos"];
            int idProced = Int32.Parse(Params["idProced"]);
            List<PacienteDto> listaPaciente = (List<PacienteDto>)Session["listaPacientes"];
            List<MedicoDTO> listaMedico = (List<MedicoDTO>)Session["listaMedicos"];
            ProcedimentoDTO procedimento = procedimentos.Find(x => x.Id == idProced);

            PropertyBag["paciente"] = listaPaciente.Find(x => x.Id == int.Parse(procedimento.IdPaciente));
            PropertyBag["medico"] = listaMedico.Find(x => x.Id == int.Parse(procedimento.IdMedico));
            PropertyBag["procedimento"] = procedimento;

        }

        public void Adicionar()
        {
            this.MenuUtilizado = "prontuario";
            this.SecaoUtilizada = "procedimento";
            this.AcaoUtilizada = "adicionar";
            PropertyBag["listaTiposProduto"] = ScemDAO.listarTiposDeProduto();
            List<MedicoDTO> medicos;
            string paciente = Params["paciente"];
            if (paciente != null && !String.IsNullOrEmpty(paciente))
            {
                PropertyBag["listaPacientes"] = PacienteDto.BuscarPorNome(paciente);
            }
            else
                PropertyBag["listaPacientes"] = PacienteDto.BuscarPorNome("");
            if (Session["listaMedicos"] == null)
            {
                medicos = MedicoDTO.ListarMedicos();
                Session["listaMedicos"] = medicos;
            }
            else
            {
                medicos = (List<MedicoDTO>)Session["listaMedicos"];
            }
            PropertyBag["listaMedicos"] = medicos;
        }

        public void Criar()
        {
            this.MenuUtilizado = "prontuario";
            this.SecaoUtilizada = "procedimento";
            this.AcaoUtilizada = "adicionar";

            try
            {
                string idMedico = Params["medico_nome"];
                string idPaciente = Params["paciente_nome"];
                string descricao = Params["procedimento_descricao"].ToString().Trim();
                List<ProcedimentoMedico.SerializedItemProcedimento> lsItens = new List<ProcedimentoMedico.SerializedItemProcedimento>();
                
                if(!String.IsNullOrEmpty(Params["item1"])){
                    ProcedimentoMedico.SerializedItemProcedimento p = new ProcedimentoMedico.SerializedItemProcedimento();
                    p.concluido = false;
                    p.idEstoque = Params["item1"];
                    p.idFuncionario = idMedico;

                    lsItens.Add(p);
                }

                if (!String.IsNullOrEmpty(Params["item2"]))
                {
                    ProcedimentoMedico.SerializedItemProcedimento p = new ProcedimentoMedico.SerializedItemProcedimento();
                    p.concluido = false;
                    p.idEstoque = Params["item2"];
                    p.idFuncionario = idMedico;

                    lsItens.Add(p);
                }

                if (!String.IsNullOrEmpty(Params["item3"]))
                {
                    ProcedimentoMedico.SerializedItemProcedimento p = new ProcedimentoMedico.SerializedItemProcedimento();
                    p.concluido = false;
                    p.idEstoque = Params["item3"];
                    p.idFuncionario = idMedico;

                    lsItens.Add(p);
                }

                ProcedimentoMedico.SerializedItemProcedimento[] itens = lsItens.ToArray();
                List<PacienteDto> listaPaciente = (List<PacienteDto>)Session["listaPacientes"];
                List<MedicoDTO> listaMedico = (List<MedicoDTO>)Session["listaMedicos"];

                ProcedimentoDTO procedimento = ProcedimentoDTO.CriarProcedimento(idMedico, idPaciente, descricao, itens);
                
                PropertyBag["paciente"] = listaPaciente.Find(x => x.Id == int.Parse(idPaciente));
                PropertyBag["medico"] = listaMedico.Find(x => x.Id == int.Parse(idMedico));
                PropertyBag["procedimento"] = procedimento;
                PropertyBag["itens"] = lsItens;
                RenderView("exibir");
            }
            catch (Exception e)
            {
                Flash["error"] = "Ocorreu um erro ao tentar salvar o prcedimento.";
                RedirectToAction("buscar");
            }
            
        }

        public void Finalizar()
        {
            string paciente = (string)Session["idPaciente"];
            int medico = Convert.ToInt32(Session["idMedico"]);

            bool check = RHFinanceiroDAO.notificarFimAtendimentoMedico(medico, paciente);

            if (check)
            {
                RedirectToAction("buscar");
            }
            else
                Flash["erro"] = "Ocorreu um erro ao tentar finalizar consulta.";
            RedirectToAction("buscar");
        }

        #endregion Actions
    }
}